package com.laozhao.server;
/**
* @author 作者  zhaoyu E-mail:774463266@qq.com
* @version 创建时间：2019年2月11日 下午2:01:50
* @description 
*/
import java.util.concurrent.atomic.AtomicLong;   

import javax.management.AttributeChangeNotification;   
import javax.management.NotificationBroadcasterSupport;   
  
/**  
 * Server Configure  
 *   
 * @author haitao.tu  
 *  
 */  
public class ServerConfigure extends NotificationBroadcasterSupport implements ServerConfigureMBean {   
       
    private AtomicLong sequenceNumber = new AtomicLong(1);   
  
    private int port;   
  
    private String host;   
  
    
    /*
       在setPort与setHos方法中，首先new了一个AttributeChangeNotification，
        这个类是javax.management.Notification的子类，而javax.management.Notification
	这个类又是java.util.EventObject的子类，由此可以证实上边所说的，JMX通知机制使用了观察者设计模式.
	javax.management.Notification是一个JMX的通知核心类，将来需要扩展或者其他JMX自带的消息，均集成自此类.
	AttributeChangeNotification根据类名可知，是一个属性改变的通知，造方法参数如下:
	Object source,                // 事件源，一直传递到java.util.EventObject的source
	long sequenceNumber,          // 通知序号，标识每次通知的计数器
	long timeStamp,               // 通知发出的时间戳 
	String msg,                   // 通知发送的message
	String attributeName,         // 被修改属性名
	String attributeType,         // 被修改属性类型
	Object oldValue,              // 被修改属性修改以前的值
	Object newValue               // 被修改属性修改以后的值
	根据观察者模式，由事件与广播组成，所以这里继承了NotificationBroadcasterSupport，来提供广播机制,
	调用NotificationBroadcasterSupportr的sendNotification(notification) 发送广播，广播会根据注册的观察者
	来对观察者进行逐一通知.
     */
    @Override  
    public void setPort(int port) {   
        int oldPort = this.port;   
        this.port = port;   
        AttributeChangeNotification notification = new AttributeChangeNotification(   
                this,   
                sequenceNumber.getAndIncrement(),   
                System.currentTimeMillis(),   
                AttributeChangeNotification.ATTRIBUTE_CHANGE,   
                "Server Port Change",   
                "java.lang.Integer",   
                oldPort + "",   
                this.port + ""  
                );   
        super.sendNotification(notification);   
    }   
  
    @Override  
    public void setHost(String host) {   
        String oldHost = this.host;   
        this.host = host;   
        AttributeChangeNotification notification = new AttributeChangeNotification(   
                this,   
                sequenceNumber.getAndIncrement(),   
                System.currentTimeMillis(),   
                AttributeChangeNotification.ATTRIBUTE_CHANGE,   
                "Server Host Change",   
                "java.lang.String",   
                oldHost,   
                this.host   
                );   
        super.sendNotification(notification);   
    }   
  
    @Override  
    public int getPort() {   
        return port;   
    }   
  
    @Override  
    public String getHost() {   
        return host;   
    }   
  
}  